package initialize

import (
	"fmt"
	"k8s.io/client-go/kubernetes"
	"k8soperation/global"
	"k8soperation/internal/app/requests"
	"k8soperation/internal/app/services"
)

func SetupK8sBootstrap() error {
	// 可在配置里加默认集群 ID；没有就传 0，让服务层走全局文件/ in-cluster 兜底
	// 初始化集群ID，如果没有设置则默认为0
	var cid uint32 = global.AppSetting.DefaultClusterID // 没有就默认为 0

	// 创建后台服务实例
	svc := services.NewBackgroundServices()
	// 初始化K8s集群，传入集群ID
	cs, err := svc.K8sClusterInit(&requests.K8sClusterInitRequest{ID: cid})
	// 检查初始化过程中是否发生错误
	if err != nil {
		// 如果发生错误，返回格式化的错误信息
		return fmt.Errorf("K8sClusterInit failed: %w", err)
	}
	// 将初始化成功的K8s客户端实例保存到全局变量中
	global.KubeClient = cs

	// 探测事件 API 版本支持情况
	global.SupportsEventsV1 = DetectEventAPIVersion(cs)
	if global.SupportsEventsV1 {
		fmt.Println("当前集群支持新版事件 API：events.k8s.io/v1")
	} else {
		fmt.Println("当前集群不支持新版事件 API，自动回退至 core/v1")
	}
	return nil
}

func DetectEventAPIVersion(client *kubernetes.Clientset) bool {
	// 检查Kubernetes集群是否支持events.k8s.io API组
	// 通过查询服务器的API组信息来判断
	// 返回true表示支持，false表示不支持
	// 获取Kubernetes服务器的API组信息
	// global.KubeClient.Discovery() 提供集群发现能力
	// ServerGroups() 方法返回服务器支持的API组列表
	groups, err := client.Discovery().ServerGroups()
	if err != nil {
		return false
	}

	for _, g := range groups.Groups {
		if g.Name == "events.k8s.io" {
			return true
		}
	}
	return false
}
